package com.svh.Controlador;

import com.svh.Entidad.Cliente;
import com.svh.Entidad.Cliente_Juridico;
import com.svh.Entidad.Cliente_Natural;
import com.svh.Entidad.SubtipoProductoMarca;
import com.svh.Paginator.ClientePaginador;
import com.svh.Paginator.Paginador;
import com.svh.Servicios.ClienteServicio;
import com.svh.Utils.ExcelExporter;
import com.svh.Utils.Exporter;
import com.svh.Utils.Utilitario;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author Luis Alonso Ballena Garcia
 */
@ManagedBean(name = "clienteControlador")
@ViewScoped
public class ClienteControlador {

    ClienteServicio clienteServicio;
    Cliente cliente;
    LazyDataModel<Cliente> clientes;
    @ManagedProperty("#{sesionControlador}")
    SesionControlador sesionControlador;
    /**
     * *
     */
    private int tipoCliente = 1;

    public ClienteControlador() {

    }

    public void initLista() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            clientes = new Paginador<Cliente>(new ClientePaginador());
            sesionControlador.generarModulo(9);
            /**
             * NUMERO MAGICO T_T *
             */
        }
    }

    public void initRegistrar() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            cliente = new Cliente();
            cliente.setNatural(new Cliente_Natural());
        }
    }
    
    public void initUpdate()
    {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = Utilitario.getFlash("idCliente");
            if (parametro == null) {
                Utilitario.redireccionarJSF(FacesContext.getCurrentInstance(), "/views/cliente/list.xhtml");
                return;
            }
            clienteServicio = new ClienteServicio();
            cliente = clienteServicio.obtenerClientePorId((Integer)parametro);
            tipoCliente = cliente.getNatural() == null ? 2 : 1;
        }
    }

    public void cargarCliente() {
        switch (tipoCliente) {
            case 1:
                cliente.setNatural(new Cliente_Natural());
                cliente.setJuridico(null);
                break;
            case 2:
                cliente.setJuridico(new Cliente_Juridico());
                cliente.setNatural(null);
                break;
        }
    }

    public void registrarCliente() {
        if (!esVistaValida()) {
            return;
        }
        clienteServicio = new ClienteServicio();
        clienteServicio.registrarCliente(cliente);
        limpiar();
    }
    
    public void actualizarCliente()
    {
        if (!esVistaValida()) {
            return;
        }
        clienteServicio.actualizarCliente(cliente);
    }
    
    public String irActualizar(int id)
    {
        Utilitario.putFlash("idCliente", id);
        return "update.xhtml?faces-redirect=true";
    }

    private void limpiar() {
        cliente = new Cliente();
        cargarCliente();
    }

    private boolean esVistaValida() {
        boolean resultado = true;
        if (cliente.getNatural() != null) {
            resultado = esClienteNaturalValido();
        } else if (cliente.getJuridico() != null) {
            resultado = esClienteJuridicoValido();
        } 
        return resultado;
    }

    private boolean esClienteNaturalValido() {
        boolean resultado = true;
        if (!esNombreValido()) {
            resultado = false;
        } else if (!esAppValido()) {
            resultado = false;
        } else if (!esApmValido()) {
            resultado = false;
        } else if (!esDniValido()) {
            resultado = false;
        }else if (!esTelefonoValido()) {
            resultado = false;
        } else if (!esCelular()) {
            resultado = false;
        } else if (!esDireccion()) {
            resultado = false;
        }
        return resultado;
    }

    private boolean esClienteJuridicoValido() {
        boolean resultado = true;
        if (!esRazonSocialValido()) {
            resultado = false;
        }else if (!esTelefonoValido()) {
            resultado = false;
        } else if (!esCelular()) {
            resultado = false;
        } else if (!esDireccion()) {
            resultado = false;
        }
        return resultado;
    }

    private boolean esNombreValido() {
        boolean resultado = true;
        if (Utilitario.esNulo(cliente.getNatural().getNombre())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el nombre");
            resultado = false;
        } else if (!Utilitario.esRangoValido(cliente.getNatural().getNombre(), 60)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres permitidos para el Nombre es de 60");
            resultado = false;
        } else if (!Utilitario.esSoloLetras(cliente.getNatural().getNombre())) {
            Utilitario.enviarMensajeGlobalError("Solo se permite letras en el Nombre");
            resultado = false;
        }
        return resultado;
    }

    private boolean esAppValido() {
        boolean resultado = true;
        if (Utilitario.esNulo(cliente.getNatural().getApellidoPaterno())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el apellido paterno");
            resultado = false;
        } else if (!Utilitario.esRangoValido(cliente.getNatural().getApellidoPaterno(), 60)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres permitidos para el apellido paterno es de 60");
            resultado = false;
        } else if (!Utilitario.esSoloLetras(cliente.getNatural().getApellidoPaterno())) {
            Utilitario.enviarMensajeGlobalError("Solo se permite letras en el apellido paterno");
            resultado = false;
        }
        return resultado;
    }

    private boolean esApmValido() {
        boolean resultado = true;
        if (Utilitario.esNulo(cliente.getNatural().getApellidoMaterno())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el apellido materno");
            resultado = false;
        } else if (!Utilitario.esRangoValido(cliente.getNatural().getApellidoMaterno(), 60)) {
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres permitidos para el apellido materno es de 60");
            resultado = false;
        } else if (!Utilitario.esSoloLetras(cliente.getNatural().getApellidoMaterno())) {
            Utilitario.enviarMensajeGlobalError("Solo se permite letras en el apellido materno");
            resultado = false;
        }
        return resultado;
    }

    private boolean esDniValido() {
        boolean resultado = true;
        if (Utilitario.esNulo(cliente.getNatural().getDni())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar el DNI");
            resultado = false;
        } else if (!Utilitario.esRangoValido(cliente.getNatural().getDni(), 8, 8)) {
            Utilitario.enviarMensajeGlobalError("El DNI es de 8 caracteres");
            resultado = false;
        }
        return resultado;
    }

    private boolean esRazonSocialValido() {
        boolean resultado = true;
        if (Utilitario.esNulo(cliente.getJuridico().getRazonSocial())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar la razon Social");
            resultado = false;
        } else if (!Utilitario.esRangoValido(cliente.getJuridico().getRazonSocial(), 120)) {
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres permitidos para la razon Social es de 120");
            resultado = false;
        }
        return resultado;
    }

    private boolean esTelefonoValido() {
        boolean resultado = true;
        if (!Utilitario.esNulo(cliente.getTelefono())) {
            if (!Utilitario.esRangoValido(cliente.getTelefono(), 8)) {
                Utilitario.enviarMensajeGlobalError("El maximo de caracteres permitidos son 7 para el teléfono ");
                resultado = false;
            } else if (!Utilitario.esSoloNumero(cliente.getTelefono())) {
                Utilitario.enviarMensajeGlobalError("Ingrese solo números en teléfono");
                resultado = false;
            }
        }
        return resultado;
    }

    private boolean esDireccion() {
        boolean resultado = true;
        if (Utilitario.esNulo(cliente.getDireccion())) {
            Utilitario.enviarMensajeGlobalError("Debe ingresar la dirección");
            resultado = false;
        } else if (!Utilitario.esRangoValido(cliente.getDireccion(), 200)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres permitidos para la dirección es de 200");
            resultado = false;
        }
        return resultado;
    }

    private boolean esCelular() {
        boolean resultado = true;
        if (!Utilitario.esNulo(cliente.getCelular())) {
            if (!Utilitario.esRangoValido(cliente.getCelular(), 9)) {
                Utilitario.enviarMensajeGlobalError("El máximo de caracateres permitidos para el celular es de 9");
                resultado = false;
            } else if (!Utilitario.esSoloNumero(cliente.getTelefono())) {
                Utilitario.enviarMensajeGlobalError("Ingrese solo números en el celular");
                resultado = false;
            }
        }
        return resultado;
    }
    
    public void exportar(){
        List<Exporter> datos = ((Paginador)clientes).getAllList();
        ExcelExporter da = new ExcelExporter(SubtipoProductoMarca.class);
        da.agregarHeader("Cliente");
        da.crearDocumento(datos);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext = ExcelExporter.getResponseContent(externalContext,"lista_clientes");
        try {
            OutputStream outputStream = externalContext.getResponseOutputStream();
            da.exportarDocumento(outputStream);
            externalContext.setResponseStatus(200);
            externalContext.responseFlushBuffer();
            facesContext.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * GETTERS AND SETTERS *
     */
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public LazyDataModel<Cliente> getClientes() {
        return clientes;
    }

    public void setClientes(LazyDataModel<Cliente> clientes) {
        this.clientes = clientes;
    }

    public int getTipoCliente() {
        return tipoCliente;
    }

    public void setTipoCliente(int tipoCliente) {
        this.tipoCliente = tipoCliente;
    }

    public void setSesionControlador(SesionControlador sesionControlador) {
        this.sesionControlador = sesionControlador;
    }

}
